package com.rc.web.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.row.Row;
import com.rc.common.constant.RoleEnum;
import com.rc.pojo.dto.adoption.AdoptionPageQuery;
import com.rc.pojo.po.Adoption;
import com.rc.pojo.vo.adoption.AdoptionPageVO;

import java.util.List;

import static com.rc.pojo.po.table.AdoptionTableDef.ADOPTION;
import static com.rc.pojo.po.table.FarmTableDef.FARM;
import static com.rc.pojo.po.table.PlantTableDef.PLANT;
import static com.rc.pojo.po.table.UserTableDef.USER;

/**
 * 领养信息表 映射层。
 * 提供领养信息相关的数据库操作接口
 */
public interface AdoptionMapper extends BaseMapper<Adoption> {

    /**
     * 根据植物类型查询领养信息
     * @param treeType 植物类型ID
     * @return 领养信息实体
     */
    default Adoption selectByThreeType(long treeType){
        return selectOneByQuery(QueryWrapper.create()
                .where(ADOPTION.PLANT_ID.eq(treeType))
        );
    }

    /**
     * 查询领养详情
     * @param id 领养ID
     * @return 领养详情行数据
     */
    default Row selectDetail(long id){
        return selectOneByQueryAs(QueryWrapper.create()
                .select(ADOPTION.ALL_COLUMNS,
                        PLANT.NAME.as("treeName"),
                        USER.ID.as("farmAdminId"),
                        USER.AVATAR.as("farmAdminAvatar"),
                        FARM.NAME.as("farmName")
                )
                .join(PLANT).on(ADOPTION.PLANT_ID.eq(PLANT.ID))
                .join(FARM).on(ADOPTION.FARM_ID.eq(FARM.ID))
                .join(USER).on(USER.FARM_ID.eq(FARM.ID)).and(USER.ROLE.eq(RoleEnum.FARM_ADMIN))
                .where(ADOPTION.ID.eq(id)),Row.class
        );
    }

    /**
     * 根据植物名称和类型查询领养列表
     * @param treeName 植物名称
     * @param treeType 植物类型ID
     * @return 领养信息行数据列表
     */
    default List<Row> selectListByTreeNameAndTreeType(String treeName, Long treeType){
        return selectRowsByQuery(QueryWrapper.create()
                .select(ADOPTION.ALL_COLUMNS,
                        PLANT.NAME.as("treeName"),
                        FARM.NAME.as("address"),
                        FARM.LNG,FARM.LAT
                )
                .join(FARM).on(ADOPTION.FARM_ID.eq(FARM.ID))
                .join(PLANT).on(ADOPTION.PLANT_ID.eq(PLANT.ID))
                .where(PLANT.NAME.like(treeName))
                .and(ADOPTION.PLANT_ID.eq(treeType))
        );
    }

    /**
     * 分页查询领养信息
     * @param query 分页查询条件
     * @return 分页结果
     */
    default Page<AdoptionPageVO> selectPage(AdoptionPageQuery query){
        return paginateAs(query.getCurrent(),query.getPageSize(),QueryWrapper.create()
                .select(ADOPTION.ALL_COLUMNS,FARM.NAME.as("address"),FARM.LNG,FARM.LAT)
                .join(FARM)
                .on(ADOPTION.FARM_ID.eq(FARM.ID)),AdoptionPageVO.class
        );
    }
}
